{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# プログラミング"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ethereum\n",
    "\n",
    "* スマートコントラクトの実行基盤としてのプラットフォーム\n",
    "    * 特定の実相を指すものではない\n",
    "    * 様々な言語のクライアントがある\n",
    "        * 推奨実装\n",
    "            * Geth(go-ethereum,ゲス)          "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ネットワーク\n",
    "\n",
    "* ライブネットワーク\n",
    "    * 世界中のノードが参加するパブリックな本番用ネットワーク\n",
    "        * パブリックブロックチェーン\n",
    "    * コンセンサスプロセスに参加できる\n",
    "* テストネットワーク\n",
    "    * Mordenテストネット\n",
    "        * 世界中のノードが参加できるネットワーク\n",
    "    * ローカルプライベートテストネット\n",
    "        * 自ノード、もしくは限られたノードのみ参加できる\n",
    "        * マイニングの難易度を指定できる\n",
    "            * 参加するノードが容易にマイニングできる"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ether\n",
    "\n",
    "* Ether\n",
    "    * Ethereumに実装されている仮想通貨\n",
    "        * 仮想通貨として送受信できる\n",
    "        * コントラクトを動かす手数料として利用することができる\n",
    "    * 単位\n",
    "        * ether\n",
    "            * 一番大きな単位\n",
    "        * wei\n",
    "            * 一番小さな単位\n",
    "            * 1etherは $10^{18}$ wei"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gas\n",
    "\n",
    "* Gas\n",
    "    * 手数料\n",
    "        * Etherの送金手数料\n",
    "        * コントラクトの実行手数料\n",
    "        * Ethereumの利用者は使用したコンピューティングリソースの対価としてマイナーにGasを支払う\n",
    "            * Gas Fee\n",
    "                * 要求するリソースの量や複雑さから決まる手数料\n",
    "                * 単位はGas\n",
    "            * Gas Price\n",
    "                * 1Gasあたりの価格\n",
    "                * 単位はwei/Gas\n",
    "        * 送金トランザクションの手数料計算例\n",
    "            * Gas Fee 21000 Gas\n",
    "            * Gas Price 2.2 x $10^{10}$ wei/Gas\n",
    "            * 1ether = 100USD\n",
    "                * 21000 x 2.2 x $10^{10}$ = 4.62 x $10^{14}$ wei\n",
    "                * 0.046USD\n",
    "    * Gas Limit\n",
    "        * トランザクション実行時の引数の一つ\n",
    "        * そのトランザクションで支払い可能な最大値\n",
    "            * 処理の実行時にGas Limitを超えた場合はそれ以上の処理は行われず処理は取り消されて実行前の状態に戻り、Gasはマイナーに支払われる\n",
    "            * 大量のリソースを使用する場合はそれに見合ったGas Limitを設定する必要がある\n",
    "            * 逆に、コントラクト側に誤りがあっても支払うのはGas Limitまで\n",
    "                * あまったGasは支払元に戻ってくる"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## テストネットワークでGethを起動\n",
    "\n",
    "### 準備\n",
    "\n",
    "* データディレクトリ\n",
    "    * `mkdir data_testnet; cd data_testnet`\n",
    "    * 以下保存される\n",
    "        * 送受信したブロックのデータ\n",
    "        * アカウント情報\n",
    "    * 省略可能\n",
    "        * `~/.ethereum` がデータディレクトリとなる\n",
    "* Genesisファイル\n",
    "    * ブロックチェーンのGenesisブロック(0番目のブロック)の情報を書いたjson形式のテキストファイル\n",
    "        * 同じブロックチェーンネットワークに参加するノードは同じGenesisブロックから連なるブロックチェーンを共有する\n",
    "\n",
    "```\n",
    "\n",
    "~/data_testnet$ vi genesis.json\n",
    "================================================\n",
    "{\n",
    "  \"config\": {\n",
    "        \"chainId\": 10,\n",
    "        \"homesteadBlock\": 0,\n",
    "        \"eip155Block\": 0,\n",
    "        \"eip158Block\": 0\n",
    "    },\n",
    "  \"nonce\"      : \"0x0000000000000042\",\n",
    "  \"timestamp\"  : \"0x00\",\n",
    "  \"parentHash\" : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n",
    "  \"extraData\"  : \"\",\n",
    "  \"gasLimit\"   : \"0x8000000\",\n",
    "  \"difficulty\" : \"0x40000\",\n",
    "  \"mixhash\"    : \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n",
    "  \"coinbase\"   : \"0x3333333333333333333333333333333333333333\",\n",
    "  \"alloc\"      : {}\n",
    "}\n",
    "================================================\n",
    "\n",
    "~/data_testnet$ geth --datadir /home/vagrant/data_testnet init /home/vagrant/data_testnet/genesis.json\n",
    "================================================\n",
    "INFO [08-16|07:28:44.986] Maximum peer count                       ETH=25 LES=0 total=25\n",
    "INFO [08-16|07:28:44.989] Allocated cache and file handles         database=/home/vagrant/data_testnet/geth/chaindata cache=16 handles=16\n",
    "INFO [08-16|07:28:45.025] Writing custom genesis block\n",
    "INFO [08-16|07:28:45.028] Persisted trie from memory database      nodes=0 size=0.00B time=628μs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B\n",
    "INFO [08-16|07:28:45.031] Successfully wrote genesis state         database=chaindata                         hash=f96000…f65339\n",
    "INFO [08-16|07:28:45.031] Allocated cache and file handles         database=/home/vagrant/data_testnet/geth/lightchaindata cache=16 handles=16\n",
    "INFO [08-16|07:28:45.072] Writing custom genesis block\n",
    "INFO [08-16|07:28:45.072] Persisted trie from memory database      nodes=0 size=0.00B time=28μs  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B\n",
    "INFO [08-16|07:28:45.074] Successfully wrote genesis state         database=lightchaindata                         hash=f96000…f65339\n",
    "================================================\n",
    "\n",
    "~/data_testnet$ LANG=C tree .\n",
    "================================================\n",
    ".\n",
    "|-- genesis.json\n",
    "|-- geth\n",
    "|   |-- chaindata   ### ブロックに関する情報\n",
    "|   |   |-- 000001.log\n",
    "|   |   |-- CURRENT\n",
    "|   |   |-- LOCK\n",
    "|   |   |-- LOG\n",
    "|   |   `-- MANIFEST-000000\n",
    "|   `-- lightchaindata\n",
    "|       |-- 000001.log\n",
    "|       |-- CURRENT\n",
    "|       |-- LOCK\n",
    "|       |-- LOG\n",
    "|       `-- MANIFEST-000000\n",
    "`-- keystore  ### アカウントに関する情報\n",
    "\n",
    "4 directories, 11 files\n",
    "================================================\n",
    "```\n",
    "\n",
    "### Gethの起動\n",
    "\n",
    "```\n",
    "~/data_testnet$ geth --networkid 1234 --nodiscover --maxpeers 0 --datadir /home/vagrant/data_testnet console 2>> /home/vagrant/data_testnet/geth.log\n",
    "================================================\n",
    "Welcome to the Geth JavaScript console!\n",
    "\n",
    "instance: Geth/v1.8.14-unstable-040aa2bb/linux-amd64/go1.10.1\n",
    " modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0\n",
    " \n",
    ">\n",
    "================================================\n",
    "```\n",
    "\n",
    "* networkid\n",
    "    * ネットワーク識別子\n",
    "    * 0～3は予約済みでそれ以外なら何でもよい\n",
    "* nodiscover\n",
    "    * このノードを他のノードから検索できないようにするオプション\n",
    "        * ノードの追加は手動で行う\n",
    "        * これを指定しないと、偶然同じnetworkidかつGenesisファイルのブロックチェーンネットワークに接続してしまう可能性がある\n",
    "* maxpeers\n",
    "    * このノードに接続できるノード数\n",
    "    * ここでは0なので他のノードに接続しない\n",
    "* console\n",
    "    * 対話型のJavaScriptコンソールを起動する"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
